// src/main/java/com/yin/waimai/repository/OrderRepository.java
package com.yin.waimai.repository;

import com.yin.waimai.enums.OrderStatus;
import com.yin.waimai.model.Order;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 订单数据访问接口
 */
@Repository
public interface OrderRepository extends MongoRepository<Order, String> {

    /**
     * 根据订单号查询订单
     * @param orderNumber 订单号
     * @return 订单 Optional
     */
    Optional<Order> findByOrderNumber(String orderNumber);

    /**
     * 根据状态查询订单列表
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> findByStatus(OrderStatus status);

    /**
     * 根据配送员 ID 查询订单列表
     * @param deliveryPersonId 配送员 ID
     * @return 订单列表
     */
    List<Order> findByDeliveryPersonId(String deliveryPersonId);

    /**
     * 根据寄件人电话查询订单 (如果需要)
     * @param shipperPhone 寄件人电话
     * @return 订单列表
     */
    List<Order> findByShipperInfoPhone(String shipperPhone);

    /**
     * 根据收件人电话查询订单 (如果需要)
     * @param recipientPhone 收件人电话
     * @return 订单列表
     */
    List<Order> findByRecipientInfoPhone(String recipientPhone);

    /**
     * 查询指定状态且未分配配送员的订单
     * @param status 订单状态
     * @return 未分配配送员的订单列表
     */
    List<Order> findByStatusAndDeliveryPersonIdIsNull(OrderStatus status);
    
    long deleteByOrderNumber(String orderNumber);
    
    /**
     * 查询最近10个订单，按创建时间降序排序
     * @return 订单列表
     */
    List<Order> findTop10ByOrderByCreationTimeDesc();
    
    /**
     * 统计指定状态的订单数量
     * @param status 订单状态
     * @return 订单数量
     */
    long countByStatus(OrderStatus status);
    
    /**
     * 根据创建者用户名查询订单
     * @param creatorUsername 创建者用户名
     * @return 订单列表
     */
    List<Order> findByCreatorUsername(String creatorUsername);
    
    // 添加根据创建者用户名查询订单的方法
    /**
     * 根据创建者用户名查询订单并按创建时间降序排序
     * @param creatorUsername 创建者用户名
     * @return 订单列表（按创建时间降序）
     */
    List<Order> findByCreatorUsernameOrderByCreationTimeDesc(String creatorUsername);
}